{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "7d0e6840-62ce-4957-94ad-898636e39c8d",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading data from https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/cifar-10-binary.tar.gz (162.2 MB)\n",
      "\n",
      "file_sizes: 100%|█████████████████████████████| 170M/170M [00:00<00:00, 360MB/s]\n",
      "Extracting tar.gz file...\n",
      "Successfully downloaded / unzipped to ./datasets-cifar10-bin\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'./datasets-cifar10-bin'"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from download import download\n",
    "\n",
    "url = \"https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/cifar-10-binary.tar.gz\"\n",
    "\n",
    "download(url, \"./datasets-cifar10-bin\", kind=\"tar.gz\", replace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "77326aab-b5f0-48a6-9ad6-331afa4c54e8",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import mindspore as ms\n",
    "import mindspore.dataset as ds\n",
    "import mindspore.dataset.vision as vision\n",
    "import mindspore.dataset.transforms as transforms\n",
    "from mindspore import dtype as mstype\n",
    "\n",
    "data_dir = \"./datasets-cifar10-bin/cifar-10-batches-bin\"  # 数据集根目录\n",
    "batch_size = 256  # 批量大小\n",
    "image_size = 32  # 训练图像空间大小\n",
    "workers = 4  # 并行线程个数\n",
    "num_classes = 10  # 分类数量\n",
    "\n",
    "\n",
    "def create_dataset_cifar10(dataset_dir, usage, resize, batch_size, workers):\n",
    "\n",
    "    data_set = ds.Cifar10Dataset(dataset_dir=dataset_dir,\n",
    "                                 usage=usage,\n",
    "                                 num_parallel_workers=workers,\n",
    "                                 shuffle=True)\n",
    "\n",
    "    trans = []\n",
    "    if usage == \"train\":\n",
    "        trans += [\n",
    "            vision.RandomCrop((32, 32), (4, 4, 4, 4)),\n",
    "            vision.RandomHorizontalFlip(prob=0.5)\n",
    "        ]\n",
    "\n",
    "    trans += [\n",
    "        vision.Resize(resize),\n",
    "        vision.Rescale(1.0 / 255.0, 0.0),\n",
    "        vision.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010]),\n",
    "        vision.HWC2CHW()\n",
    "    ]\n",
    "\n",
    "    target_trans = transforms.TypeCast(mstype.int32)\n",
    "\n",
    "    # 数据映射操作\n",
    "    data_set = data_set.map(operations=trans,\n",
    "                            input_columns='image',\n",
    "                            num_parallel_workers=workers)\n",
    "\n",
    "    data_set = data_set.map(operations=target_trans,\n",
    "                            input_columns='label',\n",
    "                            num_parallel_workers=workers)\n",
    "\n",
    "    # 批量操作\n",
    "    data_set = data_set.batch(batch_size)\n",
    "\n",
    "    return data_set\n",
    "\n",
    "\n",
    "# 获取处理后的训练与测试数据集\n",
    "\n",
    "dataset_train = create_dataset_cifar10(dataset_dir=data_dir,\n",
    "                                       usage=\"train\",\n",
    "                                       resize=image_size,\n",
    "                                       batch_size=batch_size,\n",
    "                                       workers=workers)\n",
    "step_size_train = dataset_train.get_dataset_size()\n",
    "\n",
    "dataset_val = create_dataset_cifar10(dataset_dir=data_dir,\n",
    "                                     usage=\"test\",\n",
    "                                     resize=image_size,\n",
    "                                     batch_size=batch_size,\n",
    "                                     workers=workers)\n",
    "step_size_val = dataset_val.get_dataset_size()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "86a29f8b-3486-4038-b34f-09dbda3f5798",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Image shape: (256, 3, 32, 32), Label shape: (256,)\n",
      "Labels: [8 1 0 0 9 6]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGFCAYAAABg2vAPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAABwsUlEQVR4nO39eZRdZZ3vj3/23meuU3VqHpJUqjJDEiAhMg8BFAFFGxVobl8uhNYlygW+9FWWXlwttLaXdUGvcsNS2r5fA3SzbAWlrxMR04Ig85DIkISMlaGSVGqeznz2/v3hj/r6GTBliiQF+/1ayyXPk8/Z+9l7P/s5T87nnffHCYIgIAAAAACEFvdYDwAAAAAAxxZsBgAAAICQg80AAAAAEHKwGQAAAABCDjYDAAAAQMjBZgAAAAAIOdgMAAAAACEHmwEAAAAg5GAzAAAAAIQcbAb+Qs477zxaunTpIeO6urrIcRy6//77j/ygAJgmdHZ20qWXXnrIuCeffJIcx6Enn3xyom/VqlXU2dl55AYHjhnW857Oxw0j2AwAMM357ne/i00lAOCIEjnWA3i/0tHRQblcjqLR6LEeCniP893vfpcaGxtp1apVx3oo7xrnnnsu5XI5isVix3oo4CiA5z39wS8DRwjHcSiRSJDnecd6KABMO1zXpUQiQa6LJSgMTPZ5Z7PZozQiIMGbKBgdHaVbbrmFOjs7KR6PU3NzM1144YX06quvsriNGzfS+eefT6lUimbOnEl33XUX+3NLM7Bq1SpKp9O0Y8cOuuiii6iqqopmzJhBX/va1wjFI98f7Nq1i2644QZatGgRJZNJamhooCuuuIK6urpY3B133EGO46jP33///eQ4zkR8Z2cnvfnmm/S73/2OHMchx3HovPPOm4jfsWMHXXHFFVRfX0+pVIpOP/10+uUvf8mO+XZe9cc//jH9wz/8A82cOZOqq6vp8ssvp+HhYSoUCnTLLbdQc3MzpdNpuu6666hQKLBjlMtl+vrXv07z5s2jeDxOnZ2ddNttt6m4t3n88cdp2bJllEgkaPHixfTTn/7UHNOhcr2+79N3vvMdWrJkCSUSCWppaaHrr7+eBgcH/+znwNFhsvPdet5v669eeeUVOvfccymVStFtt91GRP+f9uRQ88ji6aefpiuuuIJmz55N8Xic2tvb6e/+7u8ol8uxuLfX4+7ubrrssssonU5TU1MTffGLX6RKpcJiwzAPkSYQfO5zn6NHHnmEbrzxRlq8eDH19/fT73//e9q0aROdfPLJREQ0ODhIF198MX3yk5+kK6+8kh555BH60pe+RCeccAJdcsklf/b4lUqFLr74Yjr99NPprrvuorVr19Ltt99O5XKZvva1rx2NSwRHkJdeeomeffZZuuqqq2jWrFnU1dVF3/ve9+i8886jjRs3UiqV+ouO953vfIduuukmSqfT9JWvfIWIiFpaWoiIqKenh84880zKZrN08803U0NDAz3wwAP08Y9/nB555BH6xCc+wY515513UjKZpC9/+cu0bds2Wr16NUWjUXJdlwYHB+mOO+6g559/nu6//36aM2cOffWrX5347Gc+8xl64IEH6PLLL6cvfOEL9MILL9Cdd95JmzZtokcffZSdZ+vWrfTXf/3X9LnPfY6uvfZaWrNmDV1xxRW0du1auvDCC/+i67/++uvp/vvvp+uuu45uvvlm2rlzJ9177720fv16euaZZ5CGO8ZMdb739/fTJZdcQldddRVdffXVE3Ob6PDn0cMPP0zZbJY+//nPU0NDA7344ou0evVq2rt3Lz388MMstlKp0EUXXUSnnXYaffOb36R169bRt771LZo3bx59/vOfn4gLxTwMACOTyQT/9b/+13f885UrVwZEFDz44IMTfYVCIWhtbQ0+9alPTfTt3LkzIKJgzZo1E33XXnttQETBTTfdNNHn+37w0Y9+NIjFYkFvb++7ezHgqJPNZlXfc889p+bM7bffHliv35o1awIiCnbu3DnRt2TJkmDlypUq9pZbbgmIKHj66acn+kZHR4M5c+YEnZ2dQaVSCYIgCJ544omAiIKlS5cGxWJxIvY//af/FDiOE1xyySXsuGeccUbQ0dEx0d6wYUNARMFnPvMZFvfFL34xIKLgt7/97URfR0dHQETBT37yk4m+4eHhoK2tLVi+fPlE39tjeuKJJyb6rr32Wnbep59+OiCi4KGHHmLnXbt2rdkPjj6Tne/W8357Lb3vvvvUMaYyj6wx3XnnnYHjOMGuXbsm+t5ej7/2ta+x2OXLlwcrVqyYaIdlHiJNIKitraUXXniB9u3b944x6XSarr766ol2LBajU089lXbs2DGpc9x4440T/+04Dt14441ULBZp3bp1hz9wMC1IJpMT/10qlai/v5/mz59P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M2cOOY5DjuNQV1cXOY5DN954Iz300EO0ZMkSisfjtHbt2nfUtLz9mfvvv5/1b968ma688kpqamqiZDJJixYtoq985St/dly7du2i+fPn09KlS6mnp+fdvGTwPmbVqlW0cuVKIiK64ooryHEcOu+88ybWxe3bt9NHPvIRqq6upv/8n/8zEf1xU/CFL3yB2tvbKR6P06JFi+ib3/wmBUHAjp3L5ejmm2+mxsZGqq6upo9//OPU3d1NjuPQHXfccbQvdVrzvkkTvPTSS/Tss8/SVVddRbNmzaKuri763ve+R+eddx5t3LiRUqnUn/18f38/XXLJJXTVVVfR1VdfTS0tLRN/tnXrVvrrv/5r+tznPkfXXnstrVmzhq644gpau3YtXXjhhe94zIcffpiy2Sx9/vOfp4aGBnrxxRdp9erVtHfvXnr44YdZbKVSoYsuuohOO+00+uY3v0nr1q2jb33rWzRv3jz6/Oc/PxF3/fXX0/3330/XXXcd3XzzzbRz50669957af369fTMM89QNBo9zDsI3it88pOfpC1bttAPf/hD+va3v02NjY1ERNTU1ERERL/97W/pxz/+Md14443U2NhInZ2dNDQ0NOnjv/baa3TOOedQNBqlz372s9TZ2Unbt2+nn//85/SNb3zD/Mz27dvpggsuoPr6evrNb34zMSYADsX1119PM2fOpP/xP/4H3XzzzXTKKadQS0sLPfTQQ1Qul+miiy6is88+m775zW9SKpWiIAjo4x//OD3xxBP06U9/mpYtW0a//vWv6dZbb6Xu7m769re/PXHsVatW0Y9//GP6L//lv9Dpp59Ov/vd7+ijH/3oMbzaaUzwPiGbzaq+5557LiCi4MEHH5zoe+KJJwIiCp544omJvpUrVwZEFNx3333qGB0dHQERBT/5yU8m+oaHh4O2trZg+fLlf/a41pjuvPPOwHGcYNeuXRN91157bUBEwde+9jUWu3z58mDFihUT7aeffjogouChhx5icWvXrjX7wfuXu+++OyCiYOfOnayfiALXdYM333yT9VvzMwiCYOfOnQERBWvWrJnoO/fcc4Pq6mo2R4MgCHzfn/jv22+/PSCioLe3N9i0aVMwY8aM4JRTTgkGBgbelesD4eLt+fnwww9P9L29Ln75y19msf/+7/8eEFHwj//4j6z/8ssvDxzHCbZt2xYEQRC88sorAREFt9xyC4tbtWpVQETB7bfffmQu5j3K+yZNkEwmJ/67VCpRf38/zZ8/n2pra+nVV1895Ofj8Thdd9115p/NmDGDPvGJT0y0a2pq6JprrqH169fTgQMHJjWm8fFx6uvrozPPPJOCIKD169er+M997nOsfc4559COHTsm2g8//DBlMhm68MILqa+vb+J/K1asoHQ6TU888cQhrxO8/1m5ciUtXrz4sD7b29tLTz31FP3t3/4tzZ49m/2Z4zgq/o033qCVK1dSZ2cnrVu3jurq6g7rvAC8E3/6yygR0a9+9SvyPI9uvvlm1v+FL3yBgiCgxx57jIiI1q5dS0REN9xwA4u76aabjuBo37u8b9IEuVyO7rzzTlqzZg11d3ez3NHw8PAhPz9z5sx3/BcG8+fPVwvhwoULieiPOdfW1lbzc7t376avfvWr9LOf/Uzl9OWYEonExM+8b1NXV8c+t3XrVhoeHqbm5mbzfG+LcEC4mTNnzmF/9u3N59KlSycV/7GPfYxaWlro17/+NaXT6cM+LwAWkUiEZs2axfp27dpFM2bMoOrqatZ//PHHT/z52//vuq56H+bPn38ER/ze5X2zGbjppptozZo1dMstt9AZZ5xBmUyGHMehq666inzfP+Tn//Rv8e8GlUqFLrzwQhoYGKAvfelLdNxxx1FVVRV1d3fTqlWr1Jg8zzvkMX3fp+bmZnrooYfMP5ebCRBOrLls/a2eiJRA9S/lU5/6FD3wwAP00EMP0fXXXz+lYwEgicfjh/yXX+Dd4X2zGXjkkUfo2muvpW9961sTffl8/i8STr0T27ZtoyAI2IK6ZcsWIvrjvzaweP3112nLli30wAMP0DXXXDPR/5vf/OawxzFv3jxat24dnXXWWe/65gW8t3inL/d34u2f7+X78Pbfot5m7ty5RPTHn/8nw913302RSIRuuOEGqq6upr/5m7/5i8YFwF9KR0cHrVu3jkZHR9mvA5s3b57487f/3/d92rlzJy1YsGAibtu2bUd3wO8R3jdbLs/z1D8rWb169ZT/5kNEtG/fPnr00Ucn2iMjI/Tggw/SsmXL3jFF8Pbf9P90TEEQ0D333HPY47jyyiupUqnQ17/+dfVn5XL5Xdn4gPcGVVVVRKS/3N+Jjo4O8jyPnnrqKdb/3e9+l7Wbmpro3HPPpR/84Ae0e/du9mfy/SL646bk+9//Pl1++eV07bXX0s9+9rO/4CoA+Mv5yEc+QpVKhe69917W/+1vf5scx6FLLrmEiIguuugiItJzfPXq1UdnoO8x3je/DFx66aX0L//yL5TJZGjx4sX03HPP0bp166ihoWHKx164cCF9+tOfppdeeolaWlroBz/4AfX09NCaNWve8TPHHXcczZs3j774xS9Sd3c31dTU0E9+8pMp+QGsXLmSrr/+errzzjtpw4YN9OEPf5ii0Sht3bqVHn74Ybrnnnvo8ssvP+zjg/cOK1asICKir3zlK3TVVVdRNBqlj33sY+8Yn8lk6IorrqDVq1eT4zg0b948+sUvfmHqTP73//7fdPbZZ9PJJ59Mn/3sZ2nOnDnU1dVFv/zlL02/eNd16V//9V/psssuoyuvvJJ+9atf0QUXXPCuXSsAf8rHPvYxOv/88+krX/kKdXV10UknnUSPP/44/d//+3/plltuoXnz5hHRH9+RT33qU/Sd73yH+vv7J/5p4du/6v6lv66933nfbAbuuece8jyPHnroIcrn83TWWWfRunXrJnaHU2HBggW0evVquvXWW+mtt96iOXPm0I9+9KM/e+xoNEo///nP6eabb6Y777yTEokEfeITn6Abb7yRTjrppMMey3333UcrVqygf/qnf6LbbruNIpEIdXZ20tVXX01nnXXWYR8XvLc45ZRT6Otf/zrdd999tHbt2omfQ/8cq1evplKpRPfddx/F43G68sor6e6771ZiwZNOOomef/55+vu//3v63ve+R/l8njo6OujKK698x2NHo1F65JFH6JJLLqG/+qu/onXr1tFpp532rlwrAH+K67r0s5/9jL761a/Sj370I1qzZg11dnbS3XffTV/4whdY7IMPPkitra30wx/+kB599FH60Ic+RD/60Y9o0aJFlEgkjtEVTE+cwPrtD0zQ2dlJS5cupV/84hfHeigAAACmyIYNG2j58uX0r//6rxOOhuB9pBkAAAAA/hRp/U5E9J3vfIdc16Vzzz33GIxo+vK+SRMAAAAAf8pdd91Fr7zyCp1//vkUiUToscceo8cee4w++9nPUnt7+7Ee3rQCmwEAAADvS84880z6zW9+Q1//+tdpbGyMZs+eTXfcccchi26FEWgGAAAAgJADzQAAAAAQcrAZAAAAAELOpDUDlkHDI89tZu14VY2KqYrzUwSGI2Aun2dt39cx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",
      "text/plain": [
       "<Figure size 640x480 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "data_iter = next(dataset_train.create_dict_iterator())\n",
    "\n",
    "images = data_iter[\"image\"].asnumpy()\n",
    "labels = data_iter[\"label\"].asnumpy()\n",
    "print(f\"Image shape: {images.shape}, Label shape: {labels.shape}\")\n",
    "\n",
    "# 训练数据集中，前六张图片所对应的标签\n",
    "print(f\"Labels: {labels[:6]}\")\n",
    "\n",
    "classes = []\n",
    "\n",
    "with open(data_dir + \"/batches.meta.txt\", \"r\") as f:\n",
    "    for line in f:\n",
    "        line = line.rstrip()\n",
    "        if line:\n",
    "            classes.append(line)\n",
    "\n",
    "# 训练数据集的前六张图片\n",
    "plt.figure()\n",
    "for i in range(6):\n",
    "    plt.subplot(2, 3, i + 1)\n",
    "    image_trans = np.transpose(images[i], (1, 2, 0))\n",
    "    mean = np.array([0.4914, 0.4822, 0.4465])\n",
    "    std = np.array([0.2023, 0.1994, 0.2010])\n",
    "    image_trans = std * image_trans + mean\n",
    "    image_trans = np.clip(image_trans, 0, 1)\n",
    "    plt.title(f\"{classes[labels[i]]}\")\n",
    "    plt.imshow(image_trans)\n",
    "    plt.axis(\"off\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "d2d6702b-2335-4c47-9e49-bf60b62cff72",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from typing import Type, Union, List, Optional\n",
    "import mindspore.nn as nn\n",
    "from mindspore.common.initializer import Normal\n",
    "\n",
    "# 初始化卷积层与BatchNorm的参数\n",
    "weight_init = Normal(mean=0, sigma=0.02)\n",
    "gamma_init = Normal(mean=1, sigma=0.02)\n",
    "\n",
    "class ResidualBlockBase(nn.Cell):\n",
    "    expansion: int = 1  # 最后一个卷积核数量与第一个卷积核数量相等\n",
    "\n",
    "    def __init__(self, in_channel: int, out_channel: int,\n",
    "                 stride: int = 1, norm: Optional[nn.Cell] = None,\n",
    "                 down_sample: Optional[nn.Cell] = None) -> None:\n",
    "        super(ResidualBlockBase, self).__init__()\n",
    "        if not norm:\n",
    "            self.norm = nn.BatchNorm2d(out_channel)\n",
    "        else:\n",
    "            self.norm = norm\n",
    "\n",
    "        self.conv1 = nn.Conv2d(in_channel, out_channel,\n",
    "                               kernel_size=3, stride=stride,\n",
    "                               weight_init=weight_init)\n",
    "        self.conv2 = nn.Conv2d(in_channel, out_channel,\n",
    "                               kernel_size=3, weight_init=weight_init)\n",
    "        self.relu = nn.ReLU()\n",
    "        self.down_sample = down_sample\n",
    "\n",
    "    def construct(self, x):\n",
    "        \"\"\"ResidualBlockBase construct.\"\"\"\n",
    "        identity = x  # shortcuts分支\n",
    "\n",
    "        out = self.conv1(x)  # 主分支第一层：3*3卷积层\n",
    "        out = self.norm(out)\n",
    "        out = self.relu(out)\n",
    "        out = self.conv2(out)  # 主分支第二层：3*3卷积层\n",
    "        out = self.norm(out)\n",
    "\n",
    "        if self.down_sample is not None:\n",
    "            identity = self.down_sample(x)\n",
    "        out += identity  # 输出为主分支与shortcuts之和\n",
    "        out = self.relu(out)\n",
    "\n",
    "        return out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "f3c95e36-4018-4367-bcc9-a954c660a668",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "class ResidualBlock(nn.Cell):\n",
    "    expansion = 4  # 最后一个卷积核的数量是第一个卷积核数量的4倍\n",
    "\n",
    "    def __init__(self, in_channel: int, out_channel: int,\n",
    "                 stride: int = 1, down_sample: Optional[nn.Cell] = None) -> None:\n",
    "        super(ResidualBlock, self).__init__()\n",
    "\n",
    "        self.conv1 = nn.Conv2d(in_channel, out_channel,\n",
    "                               kernel_size=1, weight_init=weight_init)\n",
    "        self.norm1 = nn.BatchNorm2d(out_channel)\n",
    "        self.conv2 = nn.Conv2d(out_channel, out_channel,\n",
    "                               kernel_size=3, stride=stride,\n",
    "                               weight_init=weight_init)\n",
    "        self.norm2 = nn.BatchNorm2d(out_channel)\n",
    "        self.conv3 = nn.Conv2d(out_channel, out_channel * self.expansion,\n",
    "                               kernel_size=1, weight_init=weight_init)\n",
    "        self.norm3 = nn.BatchNorm2d(out_channel * self.expansion)\n",
    "\n",
    "        self.relu = nn.ReLU()\n",
    "        self.down_sample = down_sample\n",
    "\n",
    "    def construct(self, x):\n",
    "\n",
    "        identity = x  # shortcuts分支\n",
    "\n",
    "        out = self.conv1(x)  # 主分支第一层：1*1卷积层\n",
    "        out = self.norm1(out)\n",
    "        out = self.relu(out)\n",
    "        out = self.conv2(out)  # 主分支第二层：3*3卷积层\n",
    "        out = self.norm2(out)\n",
    "        out = self.relu(out)\n",
    "        out = self.conv3(out)  # 主分支第三层：1*1卷积层\n",
    "        out = self.norm3(out)\n",
    "\n",
    "        if self.down_sample is not None:\n",
    "            identity = self.down_sample(x)\n",
    "\n",
    "        out += identity  # 输出为主分支与shortcuts之和\n",
    "        out = self.relu(out)\n",
    "\n",
    "        return out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "ea43c7b1-0056-4016-82f9-e2cf0ca6d86a",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "def make_layer(last_out_channel, block: Type[Union[ResidualBlockBase, ResidualBlock]],\n",
    "               channel: int, block_nums: int, stride: int = 1):\n",
    "    down_sample = None  # shortcuts分支\n",
    "\n",
    "    if stride != 1 or last_out_channel != channel * block.expansion:\n",
    "\n",
    "        down_sample = nn.SequentialCell([\n",
    "            nn.Conv2d(last_out_channel, channel * block.expansion,\n",
    "                      kernel_size=1, stride=stride, weight_init=weight_init),\n",
    "            nn.BatchNorm2d(channel * block.expansion, gamma_init=gamma_init)\n",
    "        ])\n",
    "\n",
    "    layers = []\n",
    "    layers.append(block(last_out_channel, channel, stride=stride, down_sample=down_sample))\n",
    "\n",
    "    in_channel = channel * block.expansion\n",
    "    # 堆叠残差网络\n",
    "    for _ in range(1, block_nums):\n",
    "\n",
    "        layers.append(block(in_channel, channel))\n",
    "\n",
    "    return nn.SequentialCell(layers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "17a7baab-a2ed-4905-9a60-d29663be28fd",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from mindspore import load_checkpoint, load_param_into_net\n",
    "\n",
    "\n",
    "class ResNet(nn.Cell):\n",
    "    def __init__(self, block: Type[Union[ResidualBlockBase, ResidualBlock]],\n",
    "                 layer_nums: List[int], num_classes: int, input_channel: int) -> None:\n",
    "        super(ResNet, self).__init__()\n",
    "\n",
    "        self.relu = nn.ReLU()\n",
    "        # 第一个卷积层，输入channel为3（彩色图像），输出channel为64\n",
    "        self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, weight_init=weight_init)\n",
    "        self.norm = nn.BatchNorm2d(64)\n",
    "        # 最大池化层，缩小图片的尺寸\n",
    "        self.max_pool = nn.MaxPool2d(kernel_size=3, stride=2, pad_mode='same')\n",
    "        # 各个残差网络结构块定义\n",
    "        self.layer1 = make_layer(64, block, 64, layer_nums[0])\n",
    "        self.layer2 = make_layer(64 * block.expansion, block, 128, layer_nums[1], stride=2)\n",
    "        self.layer3 = make_layer(128 * block.expansion, block, 256, layer_nums[2], stride=2)\n",
    "        self.layer4 = make_layer(256 * block.expansion, block, 512, layer_nums[3], stride=2)\n",
    "        # 平均池化层\n",
    "        self.avg_pool = nn.AvgPool2d()\n",
    "        # flattern层\n",
    "        self.flatten = nn.Flatten()\n",
    "        # 全连接层\n",
    "        self.fc = nn.Dense(in_channels=input_channel, out_channels=num_classes)\n",
    "\n",
    "    def construct(self, x):\n",
    "\n",
    "        x = self.conv1(x)\n",
    "        x = self.norm(x)\n",
    "        x = self.relu(x)\n",
    "        x = self.max_pool(x)\n",
    "\n",
    "        x = self.layer1(x)\n",
    "        x = self.layer2(x)\n",
    "        x = self.layer3(x)\n",
    "        x = self.layer4(x)\n",
    "\n",
    "        x = self.avg_pool(x)\n",
    "        x = self.flatten(x)\n",
    "        x = self.fc(x)\n",
    "\n",
    "        return x\n",
    "def _resnet(model_url: str, block: Type[Union[ResidualBlockBase, ResidualBlock]],\n",
    "            layers: List[int], num_classes: int, pretrained: bool, pretrained_ckpt: str,\n",
    "            input_channel: int):\n",
    "    model = ResNet(block, layers, num_classes, input_channel)\n",
    "\n",
    "    if pretrained:\n",
    "        # 加载预训练模型\n",
    "        download(url=model_url, path=pretrained_ckpt, replace=True)\n",
    "        param_dict = load_checkpoint(pretrained_ckpt)\n",
    "        load_param_into_net(model, param_dict)\n",
    "\n",
    "    return model\n",
    "\n",
    "\n",
    "def resnet50(num_classes: int = 1000, pretrained: bool = False):\n",
    "    \"\"\"ResNet50模型\"\"\"\n",
    "    resnet50_url = \"https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/models/application/resnet50_224_new.ckpt\"\n",
    "    resnet50_ckpt = \"./LoadPretrainedModel/resnet50_224_new.ckpt\"\n",
    "    return _resnet(resnet50_url, ResidualBlock, [3, 4, 6, 3], num_classes,\n",
    "                   pretrained, resnet50_ckpt, 2048)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "7bb98028-ade9-44c7-90ee-0092d57fa209",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "\n",
    "import os\n",
    "# 最佳模型存储路径\n",
    "best_acc = 0\n",
    "best_ckpt_dir = \"./BestCheckpoint\"\n",
    "best_ckpt_path = \"./BestCheckpoint/resnet50-best.ckpt\"\n",
    "\n",
    "if not os.path.exists(best_ckpt_dir):\n",
    "    os.mkdir(best_ckpt_dir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "a45d2f6e-9a3d-4f5a-83ee-9c7ebd81c2dc",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "def visualize_model(best_ckpt_path, dataset_val):\n",
    "    num_class = 10\n",
    "    net = resnet50(num_class)\n",
    "    # 加载模型参数\n",
    "    param_dict = ms.load_checkpoint(best_ckpt_path)\n",
    "    ms.load_param_into_net(net, param_dict)\n",
    "    # 加载验证集的数据进行验证\n",
    "    data = next(dataset_val.create_dict_iterator())\n",
    "    images = data[\"image\"]\n",
    "    labels = data[\"label\"]\n",
    "    # 预测图像类别\n",
    "    output = net(data['image'])\n",
    "    pred = np.argmax(output.asnumpy(), axis=1)\n",
    "\n",
    "    # 图像分类\n",
    "    classes = []\n",
    "\n",
    "    with open(data_dir + \"/batches.meta.txt\", \"r\") as f:\n",
    "        for line in f:\n",
    "            line = line.rstrip()\n",
    "            if line:\n",
    "                classes.append(line)\n",
    "\n",
    "    # 显示图像及图像的预测值\n",
    "    plt.figure()\n",
    "    for i in range(6):\n",
    "        plt.subplot(2, 3, i + 1)\n",
    "        # 若预测正确，显示为蓝色；若预测错误，显示为红色\n",
    "        color = 'blue' if pred[i] == labels.asnumpy()[i] else 'red'\n",
    "        plt.title('predict:{}'.format(classes[pred[i]]), color=color)\n",
    "        picture_show = np.transpose(images.asnumpy()[i], (1, 2, 0))\n",
    "        mean = np.array([0.4914, 0.4822, 0.4465])\n",
    "        std = np.array([0.2023, 0.1994, 0.2010])\n",
    "        picture_show = std * picture_show + mean\n",
    "        picture_show = np.clip(picture_show, 0, 1)\n",
    "        plt.imshow(picture_show)\n",
    "        plt.axis('off')\n",
    "\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "16716df7-07c2-4013-ab49-e3fde9daa51c",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用测试数据集进行验证\n",
    "visualize_model(best_ckpt_path=best_ckpt_path, dataset_val=dataset_val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5dd74ea4-31be-4200-93d6-7a46e4fcf34d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.21"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
